// src/api/request.ts
import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建 axios 实例
const service = axios.create({
  baseURL: '/api', // 设置基础 URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
  },
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    console.log('发送请求:', config)
    // 获取 token
    const accessToken = localStorage.getItem('accessToken')

    // 如果有 token，添加到请求头
    if (accessToken && config.headers) {
      config.headers['Authorization'] = `Bearer ${accessToken}`
    }

    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    console.log('收到响应:', response)
    // 直接返回响应数据
    return response.data
  },
  (error) => {
    console.error('响应错误:', error)
    // 处理错误响应
    if (error.response) {
      // 对于登录等特定接口，不显示通用错误消息，让具体业务处理
      const url = error.response.config?.url;
      const isAuthEndpoint = url && (url.includes('/login/') || url.includes('/register/'));

      switch (error.response.status) {
        case 400:
          // 如果是认证相关的端点，不显示通用错误消息
          if (!isAuthEndpoint) {
            ElMessage.error('请求参数错误')
          }
          break
        case 401:
          ElMessage.error('未授权，请重新登录')
          // 清除本地存储的用户信息
          localStorage.removeItem('accessToken')
          localStorage.removeItem('refreshToken')
          localStorage.removeItem('userInfo')
          // 跳转到登录页
          window.location.href = '/login'
          break
        case 403:
          ElMessage.error('权限不足')
          break
        case 404:
          ElMessage.error('请求的资源不存在')
          break
        case 500:
          ElMessage.error('服务器内部错误')
          break
        default:
          if (!isAuthEndpoint) {
            ElMessage.error('请求失败')
          }
      }
    } else {
      ElMessage.error('网络错误，请检查网络连接')
    }
    return Promise.reject(error)
  }
)

// 封装请求方法
class Request {
  /**
   * GET 请求封装
   * @param url 请求地址
   * @param params URL 参数
   * @param config 额外请求配置
   */
  get(url, params, config) {
    // 确保 URL 格式正确
    const fullUrl = url.startsWith('/') ? url : `/${url}`
    return service.get(fullUrl, {params, ...config})
  }

  /**
   * POST 请求封装
   * @param url 请求地址
   * @param data 请求体
   * @param config 额外请求配置
   */
  post(url, data, config) {
    // 确保 URL 格式正确
    const fullUrl = url.startsWith('/') ? url : `/${url}`
    return service.post(fullUrl, data, config)
  }

  /**
   * PUT 请求封装
   * @param url 请求地址
   * @param data 请求体
   * @param config 额外请求配置
   */
  put(url, data, config) {
    // 确保 URL 格式正确
    const fullUrl = url.startsWith('/') ? url : `/${url}`
    return service.put(fullUrl, data, config)
  }

  /**
   * DELETE 请求封装
   * @param url 请求地址
   * @param config 额外请求配置
   */
  delete(url, config) {
    // 确保 URL 格式正确
    const fullUrl = url.startsWith('/') ? url : `/${url}`
    return service.delete(fullUrl, config)
  }
}

// 创建请求实例
const request = new Request()

// 导出具体 API 接口
export interface LoginRequest {
  username: string
  password: string
  remember: boolean
}

export interface LoginResponse {
  success: boolean
  message?: string
  data?: {
    accessToken: string
    refreshToken: string
    user: {
      id: number
      username: string
      role: string
    }
  }
}

export interface RegisterRequest {
  username: string
  password: string
}

export interface RegisterResponse {
  success: boolean
  message?: string
}

/**
 * 用户注册接口
 * @param data 注册表单数据
 */
export const registerApi = (data) => {
  return request.post('/register/', data)
}

/**
 * 用户登录接口
 * @param data 登录表单数据
 */
export const loginApi = (data) => {
  return request.post('/login/', data)
}

export default service
